<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        var stu={
            name:"alice",
            age:20,
            say:function(){
                console.log("hi");
            }
        };
        var name="cici";
        var age=30;
        //ES6中的简写方式
        var stu2={
            name,
            age,
            say(){
                console.log("hi");
            }
        };
        console.log(stu2);
        // ES5中Object.defineProperty(object, propertyName, descriptor)
        // defineProperty:用于定义对象属性中构建属性的特殊状态
        //     object:将要添加属性的目标对象
        //     propertyName:对象中要添加的属性名(string)
        //     descriptor:对象参数(描述符)，详细设置该属性在对象中表现形式
              
        //         value:定义属性取值
        //         writable:描述该属性是否允许被修改，默认false
        //         configurable:描述该属性是否允许被删除，默认false
        //         enumerable:描述该属性是否允许循环查找（是否允许被遍历），默认false 

        //         数据操作劫持(拦截)方法
        //         value、writable配置和get、set配置是不能同时定义于同一个属性的配置
        //         get、set方法依赖于外部变量为变量提供数据支持
        //         get 取值方法，需要定义返回值，劫持（拦截）对象中属性的取值行为
        //             通过返回值描述该属性的取值
        //         set 赋值方法，有参数，无返回值，劫持（拦截）对象中属性的赋值行为
        //             参数属性赋值时传入的新数据
        // 
        var user2={name:"alice"};
        user2.age=20;
        //定义一个属性
        Object.defineProperty(user2,"sex",{
            value:"female",//设置sex的当前值
            writable:true,//是否能被修改
            configurable:false,//是否允许被删除
            enumerable:true//是否可以被循环遍历
        });
        delete user2.sex;//有返回值，返回true或者false
        user2.sex="不男不女";
        for(var key in user2){
            console.log(key+"="+user2[key]);
        }
        var info="嘿嘿";

        //数据劫持(拦截)操作
        Object.defineProperty(user2,"hobby",{
            // value、writable配置和get、set配置是不能同时定义于同一个属性的配置
            set(n){
               info=n;
            },
            get(){
                console.log(22);
                return info;
            },
            enumerable:true,
            configurable:true

        });
        user2.hobby="嘻嘻";//给属性赋值操作
        console.log(user2.hobby);//获取对象属性值的操作
        console.log(user2);
        for(var key in user2){
            console.log(key+"="+user2[key]);
        }
        var user3={name:"cici"};
        // Object.defineProperties(object,descriptor);
         // 对某个对象进行多个属性的统一定义和属性功能描述
        // descriptors取值类型是object
            // key 是需要定义的属性名称
            // value是该属性的相关描述，取值object
        // 返回的是一个被构建了属性的新对象
        var info2="我是默认值"
        Object.defineProperties(user3,{

            //定义属性值的方式
            age:{
                value:34,
                writable:true,
                enumerable:true,
                configurable:true
            },
            sex:{
                enumerable:true,
                configurable:true,
                get(){
                    return info2;
                },
                set(n){
                    info2=n;
                }
            }
        });
        user3.sex="嘻嘻嘻嘻";//赋值
        console.log(user3.sex);



    </script>
</head>
<body>
    
</body>
</html>